์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํ๋๋ ์ด์ ๋ฒ์ ์ถฉ๋์ ๋ํ ์ฌ์ธต ๋ถ์์ผ๋ก, ํ๋ ฅ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ๊ตฌ์ถ์ ์ํ ๊ทผ๋ณธ ์์ธ๊ณผ ํจ๊ณผ์ ์ธ ํด๊ฒฐ ์ ๋ต์ ํ๊ตฌํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํ๋๋ ์ด์ : ํด๊ฒฐ ์ ๋ต์ผ๋ก ๋ฒ์ ์ถฉ๋ ํด๊ฒฐํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํ๋๋ ์ด์ ์ ์นํฉ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ผ๋ก, ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐฐํฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ์ฝ๋๋ฅผ ๊ณต์ ํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ฅผ ํตํด ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ํคํ ์ฒ๋ฅผ ๊ตฌํํ ์ ์์ผ๋ฉฐ, ์ฌ๋ฌ ํ์ด ๋ ํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ณ ๋ถ๋ถ์ ์์ ํ๊ณ ๋ฐฐํฌํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด๋ฌํ ๋ถ์ฐ๋ ํน์ฑ์ ๊ณต์ ์์กด์ฑ ๊ฐ์ ๋ฒ์ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ์ผ๊ธฐํฉ๋๋ค. ์ด ๊ธ์์๋ ์ด๋ฌํ ์ถฉ๋์ ๊ทผ๋ณธ ์์ธ์ ํ๊ตฌํ๊ณ ํจ๊ณผ์ ์ธ ํด๊ฒฐ ์ ๋ต์ ์ ๊ณตํฉ๋๋ค.
๋ชจ๋ ํ๋๋ ์ด์ ์์์ ๋ฒ์ ์ถฉ๋ ์ดํดํ๊ธฐ
๋ชจ๋ ํ๋๋ ์ด์ ์ค์ ์์, ์๋ก ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ (ํธ์คํธ์ ์๊ฒฉ)์ ๋์ผํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: React, Lodash)์ ์์กดํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ด ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐ๋๊ณ ๋ฐฐํฌ๋ ๋, ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค๋ฅธ ๋ฒ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ํธ์คํธ์ ์๊ฒฉ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํธํ๋์ง ์๋ ๋ฒ์ ์ ๋์ผํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ๋ฐํ์ ์ค๋ฅ๋ ์๊ธฐ์น ์์ ๋์์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ค๋ฅธ ๋ฒ์ ์๊ตฌ์ฌํญ: ๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์
package.jsonํ์ผ์ ๊ณต์ ์์กด์ฑ์ ๋ํ ๋ค๋ฅธ ๋ฒ์ ๋ฒ์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ ์ ํ๋ฆฌ์ผ์ด์ ์react: ^16.0.0์ ์๊ตฌํ๊ณ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์react: ^17.0.0์ ์๊ตฌํ ์ ์์ต๋๋ค. - ์ ์ด ์์กด์ฑ: ์ต์์ ์์กด์ฑ์ด ์ผ์นํ๋๋ผ๋, ์ ์ด ์์กด์ฑ(์์กด์ฑ์ ์์กด์ฑ)์ด ๋ฒ์ ์ถฉ๋์ ์ผ์ผํฌ ์ ์์ต๋๋ค.
- ์ผ๊ด์ฑ ์๋ ๋น๋ ํ๋ก์ธ์ค: ์๋ก ๋ค๋ฅธ ๋น๋ ์ค์ ์ด๋ ๋น๋ ๋๊ตฌ๋ก ์ธํด ์ต์ข ๋ฒ๋ค์ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค๋ฅธ ๋ฒ์ ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
- ๋น๋๊ธฐ ๋ก๋ฉ: ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ข ์ข ์๊ฒฉ ๋ชจ๋์ ๋น๋๊ธฐ ๋ก๋ฉ์ ํฌํจํฉ๋๋ค. ๋ง์ฝ ํธ์คํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค๋ฅธ ๋ฒ์ ์ ์์กดํ๋ ์๊ฒฉ ๋ชจ๋์ ๋ก๋ํ๋ฉด, ์๊ฒฉ ๋ชจ๋์ด ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ๊ทผํ๋ ค๊ณ ํ ๋ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
์์ ์๋๋ฆฌ์ค
๋ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ค๊ณ ์์ํด ๋ณด์ธ์:
- ํธ์คํธ ์ ํ๋ฆฌ์ผ์ด์ (์ฑ A): React ๋ฒ์ 17.0.2๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์๊ฒฉ ์ ํ๋ฆฌ์ผ์ด์ (์ฑ B): React ๋ฒ์ 16.8.0์ ์ฌ์ฉํฉ๋๋ค.
์ฑ A๋ ์ฑ B๋ฅผ ์๊ฒฉ ๋ชจ๋๋ก ์ฌ์ฉํฉ๋๋ค. ์ฑ A๊ฐ React 16.8.0 ๊ธฐ๋ฅ์ ์์กดํ๋ ์ฑ B์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ค๊ณ ํ ๋, ์ฑ A๊ฐ React 17.0.2๋ฅผ ์คํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๋ ์๊ธฐ์น ์์ ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ฒ์ ์ถฉ๋ ํด๊ฒฐ ์ ๋ต
๋ชจ๋ ํ๋๋ ์ด์ ์์ ๋ฒ์ ์ถฉ๋์ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋ฌ ์ ๋ต์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ต์์ ์ ๊ทผ ๋ฐฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์๊ตฌ์ฌํญ๊ณผ ์ถฉ๋์ ์ฑ๊ฒฉ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
1. ์์กด์ฑ ๋ช ์์ ์ผ๋ก ๊ณต์ ํ๊ธฐ
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋จ๊ณ๋ ํธ์คํธ์ ์๊ฒฉ ์ ํ๋ฆฌ์ผ์ด์
๊ฐ์ ์ด๋ค ์์กด์ฑ์ ๊ณต์ ํ ์ง ๋ช
์์ ์ผ๋ก ์ ์ธํ๋ ๊ฒ์
๋๋ค. ์ด๋ ํธ์คํธ์ ์๊ฒฉ ๋ชจ๋์ ์นํฉ ์ค์ ์์ shared ์ต์
์ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค.
// webpack.config.js (ํธ์คํธ ๋ฐ ์๊ฒฉ)
module.exports = {
// ... ๋ค๋ฅธ ์ค์ ๋ค
plugins: [
new ModuleFederationPlugin({
// ... ๋ค๋ฅธ ์ค์ ๋ค
shared: {
react: {
singleton: true,
eager: true,
requiredVersion: '^17.0.0', // ๋๋ ๋ ๊ตฌ์ฒด์ ์ธ ๋ฒ์ ๋ฒ์
},
'react-dom': {
singleton: true,
eager: true,
requiredVersion: '^17.0.0',
},
// ๋ค๋ฅธ ๊ณต์ ์์กด์ฑ๋ค
},
}),
],
};
shared ์ค์ ์ต์
์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
singleton: true: ์ด ์ต์ ์ ๊ณต์ ๋ชจ๋์ ์ธ์คํด์ค๊ฐ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋จ ํ๋๋ง ์ฌ์ฉ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ React์ ๊ฐ์ด ์ฌ๋ฌ ์ธ์คํด์ค๊ฐ ์กด์ฌํ๋ฉด ์ค๋ฅ๋ฅผ ์ ๋ฐํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด ๊ฐ์true๋ก ์ค์ ํ๋ฉด ๋ชจ๋ ํ๋๋ ์ด์ ์ ๊ณต์ ๋ชจ๋์ ๋ฒ์ ์ด ํธํ๋์ง ์์ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.eager: true: ๊ธฐ๋ณธ์ ์ผ๋ก ๊ณต์ ๋ชจ๋์ ์ง์ฐ ๋ก๋๋ฉ๋๋ค.eager๋ฅผtrue๋ก ์ค์ ํ๋ฉด ๊ณต์ ๋ชจ๋์ด ์ฆ์ ๋ก๋๋๋๋ก ๊ฐ์ ํ์ฌ ๋ฒ์ ์ถฉ๋๋ก ์ธํ ๋ฐํ์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.requiredVersion: '^17.0.0': ์ด ์ต์ ์ ํ์ํ ๊ณต์ ๋ชจ๋์ ์ต์ ๋ฒ์ ์ ์ง์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ๋ฒ์ ํธํ์ฑ์ ๊ฐ์ ํ ์ ์์ต๋๋ค. ํจ์น ์ ๋ฐ์ดํธ๋ฅผ ํ์ฉํ๋ ค๋ฉด ๋จ์ผ ๋ฒ์ ๋ฒํธ ๋์ ํน์ ๋ฒ์ ๋ฒ์(์:^17.0.0๋๋>=17.0.0 <18.0.0)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ ์ฌ๋ฌ ํ์ด ๋์ผํ ์์กด์ฑ์ ๋ค๋ฅธ ํจ์น ๋ฒ์ ์ ์ฌ์ฉํ ์ ์๋ ๋๊ท๋ชจ ์กฐ์ง์์ ํนํ ์ค์ํฉ๋๋ค.
2. ์ ์์ ๋ฒ์ (SemVer) ๋ฐ ๋ฒ์ ๋ฒ์
์ ์์ ๋ฒ์ (SemVer) ์์น์ ์ค์ํ๋ ๊ฒ์ ์์กด์ฑ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐ ํ์์ ์ ๋๋ค. SemVer๋ ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ ๋ฒ์ ๋ฒํธ(MAJOR.MINOR.PATCH)๋ฅผ ์ฌ์ฉํ๋ฉฐ ๊ฐ ๋ถ๋ถ์ ์ฆ๊ฐ์ํค๋ ๊ท์น์ ์ ์ํฉ๋๋ค:
- MAJOR: ํธํ๋์ง ์๋ API ๋ณ๊ฒฝ์ด ์์ ๋ ์ฆ๊ฐ์ํต๋๋ค.
- MINOR: ํ์ ํธํ์ฑ์ ์ ์งํ๋ฉด์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ ์ฆ๊ฐ์ํต๋๋ค.
- PATCH: ํ์ ํธํ์ฑ์ ์ ์งํ๋ฉด์ ๋ฒ๊ทธ๋ฅผ ์์ ํ ๋ ์ฆ๊ฐ์ํต๋๋ค.
package.json ํ์ผ์ด๋ shared ์ค์ ์์ ๋ฒ์ ์๊ตฌ์ฌํญ์ ์ง์ ํ ๋, ํธํ๋๋ ์
๋ฐ์ดํธ๋ฅผ ํ์ฉํ๋ฉด์ ๋ธ๋ ์ดํน ์ฒด์ธ์ง๋ฅผ ํผํ๊ธฐ ์ํด ๋ฒ์ ๋ฒ์(์: ^17.0.0, >=17.0.0 <18.0.0, ~17.0.2)๋ฅผ ์ฌ์ฉํ์ธ์. ์ผ๋ฐ์ ์ธ ๋ฒ์ ๋ฒ์ ์ฐ์ฐ์์ ๋ํ ๊ฐ๋จํ ์ค๋ช
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
^(์บ๋ฟ): ๊ฐ์ฅ ์ผ์ชฝ์ 0์ด ์๋ ์ซ์๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ์ ๋ฐ์ดํธ๋ฅผ ํ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด,^1.2.3์1.2.4,1.3.0์ ํ์ฉํ์ง๋ง2.0.0์ ํ์ฉํ์ง ์์ต๋๋ค.^0.2.3์0.2.4๋ ํ์ฉํ์ง๋ง0.3.0์ ํ์ฉํ์ง ์์ต๋๋ค.~(ํธ๋): ํจ์น ์ ๋ฐ์ดํธ๋ฅผ ํ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด,~1.2.3์1.2.4๋ ํ์ฉํ์ง๋ง1.3.0์ ํ์ฉํ์ง ์์ต๋๋ค.>=: ํฌ๊ฑฐ๋ ๊ฐ์.<=: ์๊ฑฐ๋ ๊ฐ์.>: ํผ.<: ์์.=: ์ ํํ ๊ฐ์.*: ๋ชจ๋ ๋ฒ์ . ํ๋ก๋์ ํ๊ฒฝ์์๋ ์๊ธฐ์น ์์ ๋์์ ์ ๋ฐํ ์ ์์ผ๋ฏ๋ก*์ฌ์ฉ์ ํผํด์ผ ํฉ๋๋ค.
3. ์์กด์ฑ ์ค๋ณต ์ ๊ฑฐ
npm dedupe๋ yarn dedupe์ ๊ฐ์ ๋๊ตฌ๋ node_modules ๋๋ ํ ๋ฆฌ์์ ์ค๋ณต๋ ์์กด์ฑ์ ์๋ณํ๊ณ ์ ๊ฑฐํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ ์์กด์ฑ์ ๋จ์ผ ๋ฒ์ ๋ง ์ค์น๋๋๋ก ํ์ฌ ๋ฒ์ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์์ต๋๋ค.
ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ์์ ๋ค์ ๋ช ๋ น์ ์คํํ์ธ์:
npm dedupe
yarn dedupe
4. ๋ชจ๋ ํ๋๋ ์ด์ ์ ๊ณ ๊ธ ๊ณต์ ์ค์ ํ์ฉ
๋ชจ๋ ํ๋๋ ์ด์ ์ ๊ณต์ ์์กด์ฑ์ ์ค์ ํ๊ธฐ ์ํ ๋ ๊ณ ๊ธ ์ต์ ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ์ต์ ์ ์ฌ์ฉํ๋ฉด ์์กด์ฑ์ด ๊ณต์ ๋๊ณ ํด๊ฒฐ๋๋ ๋ฐฉ์์ ๋ฏธ์ธ ์กฐ์ ํ ์ ์์ต๋๋ค.
version: ๊ณต์ ๋ชจ๋์ ์ ํํ ๋ฒ์ ์ ์ง์ ํฉ๋๋ค.import: ๊ณต์ ํ ๋ชจ๋์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค.shareKey: ๋ชจ๋์ ๊ณต์ ํ ๋ ๋ค๋ฅธ ํค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๋์ผํ ๋ชจ๋์ ์ฌ๋ฌ ๋ฒ์ ์ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๊ณต์ ํด์ผ ํ ๋ ์ ์ฉํ ์ ์์ต๋๋ค.shareScope: ๋ชจ๋์ด ๊ณต์ ๋ ๋ฒ์๋ฅผ ์ง์ ํฉ๋๋ค.strictVersion: true๋ก ์ค์ ํ๋ฉด, ๊ณต์ ๋ชจ๋์ ๋ฒ์ ์ด ์ง์ ๋ ๋ฒ์ ๊ณผ ์ ํํ ์ผ์นํ์ง ์์ ๊ฒฝ์ฐ ๋ชจ๋ ํ๋๋ ์ด์ ์ด ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.
๋ค์์ shareKey์ import ์ต์
์ ์ฌ์ฉํ๋ ์์ ์
๋๋ค:
// webpack.config.js (ํธ์คํธ ๋ฐ ์๊ฒฉ)
module.exports = {
// ... ๋ค๋ฅธ ์ค์ ๋ค
plugins: [
new ModuleFederationPlugin({
// ... ๋ค๋ฅธ ์ค์ ๋ค
shared: {
react16: {
import: 'react',
shareKey: 'react',
singleton: true,
requiredVersion: '^16.0.0',
},
react17: {
import: 'react',
shareKey: 'react',
singleton: true,
requiredVersion: '^17.0.0',
},
},
}),
],
};
์ด ์์ ์์๋ React 16๊ณผ React 17์ด ๋ชจ๋ ๋์ผํ shareKey('react')๋ก ๊ณต์ ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ํธ์คํธ์ ์๊ฒฉ ์ ํ๋ฆฌ์ผ์ด์
์ ์ถฉ๋ ์์ด ์๋ก ๋ค๋ฅธ ๋ฒ์ ์ React๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ์ํค๊ณ ๋ค๋ฅธ React ๋ฒ์ ์ด ์ค์ ๋ก ํธํ๋์ง ์๋ ๊ฒฝ์ฐ ์ ์ฌ์ ์ธ ๋ฐํ์ ๋ฌธ์ ๋ฅผ ์ ๋ฐํ ์ ์์ผ๋ฏ๋ก ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋์์ ๋จ์ผ React ๋ฒ์ ์ผ๋ก ํ์คํํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค.
5. ์ค์ ์ง์ค์ ์์กด์ฑ ๊ด๋ฆฌ ์์คํ ์ฌ์ฉ
๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ฅผ ๊ฐ๋ฐํ๋ ์ฌ๋ฌ ํ์ด ์๋ ๋๊ท๋ชจ ์กฐ์ง์ ๊ฒฝ์ฐ, ์ค์ ์ง์ค์ ์์กด์ฑ ๊ด๋ฆฌ ์์คํ
์ ๋งค์ฐ ์ค์ํ ์ ์์ต๋๋ค. ์ด ์์คํ
์ ์ฌ์ฉํ์ฌ ๊ณต์ ์์กด์ฑ์ ๋ํ ์ผ๊ด๋ ๋ฒ์ ์๊ตฌ์ฌํญ์ ์ ์ํ๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค. pnpm(๊ณต์ node_modules ์ ๋ต ํฌํจ)๊ณผ ๊ฐ์ ๋๊ตฌ๋ ๋ง์ถคํ ์๋ฃจ์
์ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํธํ๋๋ ๋ฒ์ ์ ์ฌ์ฉํ๋๋ก ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์์: pnpm
pnpm์ ์ฝํ ์ธ ์ฃผ์ ์ง์ ํ์ผ ์์คํ ์ ์ฌ์ฉํ์ฌ ํจํค์ง๋ฅผ ์ ์ฅํฉ๋๋ค. ํจํค์ง๋ฅผ ์ค์นํ๋ฉด pnpm์ ํด๋น ํจํค์ง์ ๋ํ ํ๋ ๋งํฌ๋ฅผ ์์ฒด ์ ์ฅ์์ ์์ฑํฉ๋๋ค. ์ด๋ ์ฌ๋ฌ ํ๋ก์ ํธ๊ฐ ํ์ผ์ ๋ณต์ ํ์ง ์๊ณ ๋์ผํ ํจํค์ง๋ฅผ ๊ณต์ ํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋์คํฌ ๊ณต๊ฐ์ ์ ์ฝํ๊ณ ์ค์น ์๋๋ฅผ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋ ์ค์ํ ๊ฒ์ ํ๋ก์ ํธ ๊ฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋๋ค๋ ๊ฒ์ ๋๋ค.
pnpm์ผ๋ก ์ผ๊ด๋ ๋ฒ์ ์ ๊ฐ์ ํ๋ ค๋ฉด pnpmfile.js ํ์ผ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ํ์ผ์ ์ฌ์ฉํ๋ฉด ํ๋ก์ ํธ์ ์์กด์ฑ์ด ์ค์น๋๊ธฐ ์ ์ ์์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ชจ๋ ํ๋ก์ ํธ๊ฐ ๋์ผํ ๋ฒ์ ์ ์ฌ์ฉํ๋๋ก ๊ณต์ ์์กด์ฑ์ ๋ฒ์ ์ ์ฌ์ ์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
// pnpmfile.js
module.exports = {
hooks: {
readPackage(pkg) {
if (pkg.dependencies && pkg.dependencies.react) {
pkg.dependencies.react = '^17.0.0';
}
if (pkg.devDependencies && pkg.devDependencies.react) {
pkg.devDependencies.react = '^17.0.0';
}
return pkg;
},
},
};
6. ๋ฐํ์ ๋ฒ์ ํ์ธ ๋ฐ ํด๋ฐฑ
๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋น๋ ์์ ์ ๋ฒ์ ์ถฉ๋์ ์์ ํ ์ ๊ฑฐํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ํฉ์์๋ ๋ฐํ์ ๋ฒ์ ํ์ธ ๋ฐ ํด๋ฐฑ์ ๊ตฌํํ ์ ์์ต๋๋ค. ์ด๋ ๋ฐํ์์ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ์ ์ ํ์ธํ๊ณ ๋ฒ์ ์ด ํธํ๋์ง ์๋ ๊ฒฝ์ฐ ๋์ฒด ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ ๋ณต์กํ๊ณ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ์ง๋ง ํน์ ์๋๋ฆฌ์ค์์๋ ํ์ํ ์ ๋ต์ด ๋ ์ ์์ต๋๋ค.
// ์์: ๋ฐํ์ ๋ฒ์ ํ์ธ
import React from 'react';
function MyComponent() {
if (React.version && React.version.startsWith('16')) {
// React 16 ๊ด๋ จ ์ฝ๋ ์ฌ์ฉ
return <div>React 16 Component</div>;
} else if (React.version && React.version.startsWith('17')) {
// React 17 ๊ด๋ จ ์ฝ๋ ์ฌ์ฉ
return <div>React 17 Component</div>;
} else {
// ํด๋ฐฑ ์ ๊ณต
return <div>์ง์๋์ง ์๋ React ๋ฒ์ </div>;
}
}
export default MyComponent;
์ค์ ๊ณ ๋ ค์ฌํญ:
- ์ฑ๋ฅ ์ํฅ: ๋ฐํ์ ํ์ธ์ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋๋ฌผ๊ฒ ์ฌ์ฉํ์ธ์.
- ๋ณต์ก์ฑ: ์ฌ๋ฌ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ๊ด๋ฆฌํ๋ฉด ์ฝ๋ ๋ณต์ก์ฑ๊ณผ ์ ์ง ๊ด๋ฆฌ ๋ถ๋ด์ด ์ฆ๊ฐํ ์ ์์ต๋๋ค.
- ํ ์คํธ: ๋ชจ๋ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์ฒ ์ ํ ํ ์คํธํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค๋ฅธ ๋ฒ์ ์์๋ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
7. ํ ์คํธ ๋ฐ ์ง์์ ํตํฉ
ํฌ๊ด์ ์ธ ํ ์คํธ๋ ๋ฒ์ ์ถฉ๋์ ์๋ณํ๊ณ ํด๊ฒฐํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ํธ์คํธ์ ์๊ฒฉ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ์ํธ ์์ฉ์ ์๋ฎฌ๋ ์ด์ ํ๋ ํตํฉ ํ ์คํธ๋ฅผ ๊ตฌํํ์ธ์. ์ด๋ฌํ ํ ์คํธ๋ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค๋ฅธ ๋ฒ์ ์ ํฌํจํ ๋ค์ํ ์๋๋ฆฌ์ค๋ฅผ ๋ค๋ฃจ์ด์ผ ํฉ๋๋ค. ๊ฒฌ๊ณ ํ ์ง์์ ํตํฉ(CI) ์์คํ ์ ์ฝ๋ ๋ณ๊ฒฝ์ด ์์ ๋๋ง๋ค ์ด๋ฌํ ํ ์คํธ๋ฅผ ์๋์ผ๋ก ์คํํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ ํ๋ก์ธ์ค ์ด๊ธฐ์ ๋ฒ์ ์ถฉ๋์ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค.
CI ํ์ดํ๋ผ์ธ ๋ชจ๋ฒ ์ฌ๋ก:
- ๋ค์ํ ์์กด์ฑ ๋ฒ์ ์ผ๋ก ํ ์คํธ ์คํ: CI ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ์ฌ ๊ณต์ ์์กด์ฑ์ ๋ค๋ฅธ ๋ฒ์ ์ผ๋ก ํ ์คํธ๋ฅผ ์คํํ์ธ์. ์ด๋ฅผ ํตํด ํ๋ก๋์ ์ ๋๋ฌํ๊ธฐ ์ ์ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ์๋ณํ ์ ์์ต๋๋ค.
- ์๋ํ๋ ์์กด์ฑ ์ ๋ฐ์ดํธ: Renovate๋ Dependabot๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์กด์ฑ์ ์๋์ผ๋ก ์ ๋ฐ์ดํธํ๊ณ ํ ๋ฆฌํ์คํธ๋ฅผ ์์ฑํ์ธ์. ์ด๋ฅผ ํตํด ์์กด์ฑ์ ์ต์ ์ํ๋ก ์ ์งํ๊ณ ๋ฒ์ ์ถฉ๋์ ํผํ ์ ์์ต๋๋ค.
- ์ ์ ๋ถ์: ์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋์์ ์ ์ฌ์ ์ธ ๋ฒ์ ์ถฉ๋์ ์๋ณํ์ธ์.
์ค์ ์ฌ๋ก ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
์ด๋ฌํ ์ ๋ต์ด ์ด๋ป๊ฒ ์ ์ฉ๋ ์ ์๋์ง ์ค์ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- ์๋๋ฆฌ์ค 1: ๋๊ท๋ชจ ์ด์ปค๋จธ์ค ํ๋ซํผ
ํ ๋๊ท๋ชจ ์ด์ปค๋จธ์ค ํ๋ซํผ์ ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ฌ์ฉํ์ฌ ์คํ ์ดํ๋ก ํธ๋ฅผ ๊ตฌ์ถํฉ๋๋ค. ์ฌ๋ฌ ํ์ด ์ ํ ๋ชฉ๋ก ํ์ด์ง, ์ผํ ์นดํธ, ๊ฒฐ์ ํ์ด์ง์ ๊ฐ์ ์คํ ์ดํ๋ก ํธ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์์ ํฉ๋๋ค. ๋ฒ์ ์ถฉ๋์ ํผํ๊ธฐ ์ํด ์ด ํ๋ซํผ์ pnpm ๊ธฐ๋ฐ์ ์ค์ ์ง์ค์ ์์กด์ฑ ๊ด๋ฆฌ ์์คํ ์ ์ฌ์ฉํฉ๋๋ค.
pnpmfile.jsํ์ผ์ ๋ชจ๋ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋์์ ๊ณต์ ์์กด์ฑ์ ์ผ๊ด๋ ๋ฒ์ ์ ๊ฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ํ ์ด ํ๋ซํผ์ ์๋ก ๋ค๋ฅธ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ๊ฐ์ ์ํธ ์์ฉ์ ์๋ฎฌ๋ ์ด์ ํ๋ ํตํฉ ํ ์คํธ๋ฅผ ํฌํจํ ํฌ๊ด์ ์ธ ํ ์คํธ ์ค์ํธ๋ฅผ ๊ฐ์ถ๊ณ ์์ต๋๋ค. Dependabot์ ํตํ ์๋ํ๋ ์์กด์ฑ ์ ๋ฐ์ดํธ๋ ์์กด์ฑ ๋ฒ์ ์ ์ฌ์ ์ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. - ์๋๋ฆฌ์ค 2: ๊ธ์ต ์๋น์ค ์ ํ๋ฆฌ์ผ์ด์
ํ ๊ธ์ต ์๋น์ค ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํฉ๋๋ค. ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ์ ๊ฐ์ ํ์ด์ง, ๊ฑฐ๋ ๋ด์ญ ํ์ด์ง, ํฌ์ ํฌํธํด๋ฆฌ์ค ํ์ด์ง์ ๊ฐ์ ์ฌ๋ฌ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์๊ฒฉํ ๊ท์ ์๊ฑด์ผ๋ก ์ธํด ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ผ๋ถ ์์กด์ฑ์ ์ด์ ๋ฒ์ ์ ์ง์ํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐํ์ ๋ฒ์ ํ์ธ ๋ฐ ํด๋ฐฑ์ ์ฌ์ฉํฉ๋๋ค. ๋ํ ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ ์ฅ์น์์ ์๋ ํ ์คํธ๋ฅผ ํฌํจํ๋ ์๊ฒฉํ ํ ์คํธ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ถ๊ณ ์์ต๋๋ค.
- ์๋๋ฆฌ์ค 3: ๊ธ๋ก๋ฒ ํ์
ํ๋ซํผ
๋ถ๋ฏธ, ์ ๋ฝ, ์์์์ ์ฌ๋ฌด์ค์์ ์ฌ์ฉ๋๋ ๊ธ๋ก๋ฒ ํ์ ํ๋ซํผ์ ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ฌ์ฉํฉ๋๋ค. ํต์ฌ ํ๋ซํผ ํ์ ์ ๊ธด ๋ฒ์ ์ ์๊ฒฉํ ๊ณต์ ์์กด์ฑ ์ธํธ๋ฅผ ์ ์ํฉ๋๋ค. ์๊ฒฉ ๋ชจ๋์ ๊ฐ๋ฐํ๋ ๊ฐ๋ณ ๊ธฐ๋ฅ ํ์ ์ด๋ฌํ ๊ณต์ ์์กด์ฑ ๋ฒ์ ์ ์ค์ํด์ผ ํฉ๋๋ค. ๋น๋ ํ๋ก์ธ์ค๋ Docker ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์คํ๋์ด ๋ชจ๋ ํ์์ ์ผ๊ด๋ ๋น๋ ํ๊ฒฝ์ ๋ณด์ฅํฉ๋๋ค. CI/CD ํ์ดํ๋ผ์ธ์๋ ๋ค์ํ ๋ธ๋ผ์ฐ์ ๋ฒ์ ๋ฐ ์ด์ ์ฒด์ ์ ๋ํด ์คํ๋๋ ๊ด๋ฒ์ํ ํตํฉ ํ ์คํธ๊ฐ ํฌํจ๋์ด, ์๋ก ๋ค๋ฅธ ์ง์ญ ๊ฐ๋ฐ ํ๊ฒฝ์์ ๋ฐ์ํ ์ ์๋ ์ ์ฌ์ ์ธ ๋ฒ์ ์ถฉ๋์ด๋ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ํฌ์ฐฉํฉ๋๋ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํ๋๋ ์ด์ ์ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ํคํ ์ฒ๋ฅผ ๊ตฌ์ถํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ณต์ ์์กด์ฑ ๊ฐ์ ์ ์ฌ์ ์ธ ๋ฒ์ ์ถฉ๋์ ํด๊ฒฐํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์์กด์ฑ์ ๋ช ์์ ์ผ๋ก ๊ณต์ ํ๊ณ , ์ ์์ ๋ฒ์ ์ ์ค์ํ๋ฉฐ, ์์กด์ฑ ์ค๋ณต ์ ๊ฑฐ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๊ณ , ๋ชจ๋ ํ๋๋ ์ด์ ์ ๊ณ ๊ธ ๊ณต์ ์ค์ ์ ํ์ฉํ๊ณ , ๊ฒฌ๊ณ ํ ํ ์คํธ ๋ฐ ์ง์์ ํตํฉ ๊ดํ์ ๊ตฌํํจ์ผ๋ก์จ ๋ฒ์ ์ถฉ๋์ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ๊ณ ํ๋ ฅ์ ์ด๊ณ ๊ฒฌ๊ณ ํ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์กฐ์ง์ ๊ท๋ชจ, ๋ณต์ก์ฑ ๋ฐ ํน์ ์๊ตฌ์ ๊ฐ์ฅ ์ ํฉํ ์ ๋ต์ ์ ํํ๋ ๊ฒ์ ๊ธฐ์ตํ์ธ์. ์์กด์ฑ ๊ด๋ฆฌ์ ๋ํ ์ฌ์ ์๋ฐฉ์ ์ด๊ณ ์ ์ ์๋ ์ ๊ทผ ๋ฐฉ์์ ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ด์ ์ ์ฑ๊ณต์ ์ผ๋ก ํ์ฉํ๋ ๋ฐ ํ์์ ์ ๋๋ค.